home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_c / cgraphix / kclippin.c < prev    next >
Text File  |  1986-05-28  |  2KB  |  117 lines

  1. /* «RM120»«PL99999»«TS4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76» */
  2. #include    <stdio.h>
  3. #define    EXTERN    extern
  4. #include    <typedef.h>
  5.  
  6. #define    min(x,y)    ((x < y) ? x : y)
  7. #define    max(x,y)    ((x > y) ? x : y)
  8.  
  9.  
  10. void SetClippingOn()
  11. {
  12.     ClippingGlb = TRUE;
  13. }
  14.  
  15.  
  16. void SetClippingOff()
  17. {
  18.     ClippingGlb = FALSE;
  19. }
  20.  
  21.  
  22. int clipping()
  23. {
  24.     return(ClippingGlb);
  25. }
  26.  
  27.  
  28. static int inside(x,xx1,xx2)
  29. int        x, xx1, xx2;
  30. {
  31.     if (x < xx1)
  32.         return(-1);
  33.     else if (x > xx2)
  34.         return(1);
  35.     return(0);
  36. }
  37.  
  38.  
  39. int clip(x1, y1, x2, y2)
  40. int        *x1, *y1, *x2, *y2;
  41. {
  42.     int        ix1, iy1, ix2, iy2, dummy, X1Loc, X2Loc, Y1Loc, Y2Loc;
  43.     int        ClipLoc;
  44.     int        retc;
  45.  
  46.     ClipLoc = TRUE;
  47.     if (!ClippingGlb) {
  48.         return(ClipLoc);
  49.     }
  50.  
  51.     ClipLoc = TRUE;
  52.     if (HatchGlb) {
  53.         X1Loc = min(X1RefGlb, X2RefGlb);
  54.         X2Loc = max(X1RefGlb, X2RefGlb);
  55.     }
  56.     else {
  57.         X1Loc = min(X1RefGlb * 8, X2RefGlb * 8 + 7);
  58.         X2Loc = max(X1RefGlb * 8, X2RefGlb * 8 + 7);
  59.     }
  60.     ix1 = inside(*x1, X1Loc, X2Loc);
  61.     ix2 = inside(*x2, X1Loc, X2Loc);
  62.     if (ix1 || ix2) {
  63.         if (*x1 != *x2) {
  64.             if (ix1 != 0) {
  65.                 dummy = (ix1 < 0) ? X1Loc : X2Loc;
  66.                 if (*y2 != *y1) {
  67.                     *y1 = dblint(*y1 + (int)((double)(*y2 - *y1)
  68.                         * (dummy - *x1) / (double)(*x2 - *x1)));
  69.                 }
  70.                 *x1 = dummy;
  71.             }
  72.             if ((ix2 != 0) && ( *x1 != *x2)) {
  73.                 dummy = (ix2 < 0) ? X1Loc : X2Loc;
  74.                 if (*y2 != *y1) {
  75.                     *y2 = dblint(*y1 + (int)((double)(*y2 - *y1)
  76.                         * (dummy - *x1) / (double)(*x2 - *x1)));
  77.                 }
  78.                 *x2 = dummy;
  79.             }
  80.         }
  81.     }
  82.  
  83.     Y1Loc = min(Y1RefGlb, Y2RefGlb);
  84.     Y2Loc = max(Y1RefGlb, Y2RefGlb);
  85.  
  86.     iy1 = inside(*y1, Y1Loc, Y2Loc);
  87.     iy2 = inside(*y2, Y1Loc, Y2Loc);
  88.     if (iy1 || iy2) {
  89.         if (*y1 != *y2) {
  90.             if (iy1 != 0) {
  91.                 dummy = (iy1 < 0) ? Y1Loc : Y2Loc;
  92.                 if (*x1 != *x2) {
  93.                     *x1 = dblint(*x1 + (int)((double)(*x2 - *x1)
  94.                         * (dummy - *y1) / (double)(*y2 - *y1)));
  95.                 }
  96.                 *y1 = dummy;
  97.             }
  98.             if ((iy2 != 0) && (*y1 != *y2)) {
  99.                 dummy = (iy2 < 0) ? Y1Loc : Y2Loc;
  100.                 if (*x1 != *x2) {
  101.                     *x2 = dblint(*x1 + (int)((double)(*x2 - *x1)
  102.                         * (dummy - *y1) / (double)(*y2 - *y1)));
  103.                 }
  104.                 *y2 = dummy;
  105.             }
  106.         }
  107.     }
  108.     if (inside(*y1,Y1Loc,Y2Loc) ||
  109.         inside(*y2,Y1Loc,Y2Loc) ||
  110.         inside(*x1,X1Loc,X2Loc) ||
  111.         inside(*x2,X1Loc,X2Loc)) {
  112.         ClipLoc = FALSE;
  113.     }
  114.     return(ClipLoc);
  115. }
  116.  
  117.